import numpy as np
import scipy.optimize as so
On récupére :
numpy
(numerical python) permettant la gestion de grand tableaux de nombres de manière efficacescipy.optimize
pour les fonctions d'optimisationdef fonction(x):
return x**3+x**2-x-1
import matplotlib.pyplot as plt
%matplotlib inline
plt.rc('figure', figsize=(12,9))
x=np.linspace(-2.0, 2.0, 101)
plt.plot(x, fonction(x), lw=2)
plt.plot(x, np.zeros_like(x), ls='-')
so.fsolve(func=fonction, x0=np.array([0]))
sources=np.linspace(-20, 20, 10)
for ini in sources:
print( "{:.3}".format(ini), " -> ", so.fsolve(func=fonction, x0=ini))
On peut obtenir des renseignements sur le calcul effectué
so.fsolve(func=fonction, x0=5.0, full_output=True)
n=10
a=np.random.random(n)
def cout(X):
return np.power(X-a, 2).sum()
resultat = so.minimize(fun=cout, x0=np.ones(n))
print(type(resultat))
print(resultat.keys())
print(resultat)
print(np.linalg.norm(resultat.x-a))
print(resultat.fun-cout(resultat.x))
A noter qu'il y a en fait plusieurs solveurs différents disponibles et qu'on peut prescrire en utilisant le paramètre method
de la fonction minimize
.
On a quelques algorithmes stochastiques disponibles
def aMinimiser(x):
"""Fonction de Rastrigin avec beaucoup de minima locaux"""
return 10*len(x)+np.sum(x**2, axis=x.ndim-1)-10*np.sum(np.cos(2*np.pi*x),axis=x.ndim-1)
x, y=np.linspace(-5,5, 401), np.linspace(-5,5, 401)
X, Y = np.meshgrid(x, y)
valeurs = aMinimiser(np.dstack((X, Y)))
plt.contour(X, Y, valeurs, cmap="viridis")
plt.imshow(valeurs, extent=[-5,5,-5,5])
sources= 10*(np.random.random(size=(10,2))-0.5*np.ones((10,2)))
print(sources)
Mise en échec des solveurs classiques
for test in sources:
temp=so.minimize(fun=aMinimiser, x0=test)
print("départ en :",test, "\n minimisation annoncée réussie : ", temp.success, "\n arrivée : ", temp.x,
"\n VALEUR DE LA FONCTION : {:.4} \n".format(temp.fun))
for test in sources:
temp=so.basinhopping(func=aMinimiser, x0=test)
print("départ en :",test, "\n arrivée : ", temp.x,
"\n VALEUR DE LA FONCTION : {:.4} \n".format(temp.fun))
so.differential_evolution(func=aMinimiser, bounds=[(-5.0,5.0),(-5.0,5.0)])